package cn.hchaojie.camp.javafx.part2;

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 * 直接耦合的坏处：
 * 
 * 1. 最开始将parent的vbox容器传给child，child知道父类的实现
 * 2. 给父类添加一个setBackground方法，封装了设置背景的细节，这时候如果容器改了，只需要修改parent的方法就可以
 * 3. 但是parent和child还是强耦合的，child直接持有父类的一个引用，child因此可以调用父类的任何方法！
 * 4. 使用listener模式，将parent和child彻底解耦
 * 
 * @author hchaojie
 *
 */
public class ReverseInteract extends Application {
	private Color[] COLORS = {
		Color.RED, Color.BLUE, Color.AQUAMARINE, Color.BLUEVIOLET
	};
	
	List<Stage> stages = new ArrayList<>();

	private int id = 1;
	private VBox box = null;

	@Override
	public void start(Stage stage) throws Exception {
		Scene scene = new Scene(createContents(), 200, 100);
		
		stage.setScene(scene);
		stage.show();
	}
	
	// 在这里创建页面布局
	private Parent createContents() {
		box = new VBox(10);
		box.setAlignment(Pos.CENTER);
		
		Button btn = new Button("创建新窗口");
		btn.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				createStage(id++);
			}
		});
		
		Button close = new Button("关闭所有");
		close.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				for (Stage stage: stages) {
					stage.close();
				}
			}
		});
		
		box.getChildren().add(btn);
		box.getChildren().add(close);

		return box;
	}

	private void createStage(int id) {
		Color c = COLORS[id % COLORS.length];

		ChildStage stage = new ChildStage(id, c, this);
		stage.show();
		stages.add(stage);
	}
	
	public void setBackground(Color color) {
		box.setBackground(new Background(new BackgroundFill(color, null, null)));
	}

	public static void main(String[] args) {
		launch(args);
	}
	
	class ChildStage extends Stage {
		public ChildStage(int id, Color color, ReverseInteract parent) {

			VBox vbox = new VBox();
			Button button = new Button("设置颜色");
			button.setBackground(new Background(new BackgroundFill(color, null, null)));
			button.setOnAction(e -> {
				// 设置父窗体的背景色
				parent.setBackground(color);
			});
			vbox.setAlignment(Pos.CENTER);
			vbox.getChildren().add(button);
			
			Scene scene = new Scene(vbox, 250, 50);
			setScene(scene);
			
			setX(100);
			setY(id * 120);
			setTitle("窗口 #" + id);
		}
	}
}
